package com.auth.Sercurity.controller;

import com.auth.Sercurity.model.Condition;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author： hj
 * @version： 1.0
 * @fileDes：  全程流程变量
 * @date： 2022/3/31 21:46
 */
@RestController
@RequestMapping("/glable")
public class GlableController {

    /**
     * @author： hj
     * @version： 1.0
     * @methodDes：  定义一个流程定义
     * @date： 2022/3/31 21:47
     */

    @GetMapping("definition")
    public String definition(){
//        获得引擎
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        得到一个RepositoryService
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//        部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("bpmn/ConditionLeave.bpmn")
                .name("流程变量员工请假申请")
                .deploy();
        System.out.println(deployment.getId());
        System.out.println(deployment.getKey());
        return deployment.getId()+"-"+deployment.getName()+"--"+"流程定义部署成功";
    }

    /**
     * @author： hj
     * @version： 1.0
     * @methodDes：  流程定义启动
     * @date： 2022/3/31 21:54
     */
    @GetMapping("/conditionStart")
    public String conditionStart(){
//        获得引擎
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        得到RuntimeService
        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
//        定义流程变量
        Map<String,Object> map=new HashMap<>();
        map.put("Element0","张三（员工）");
        map.put("Element1","李四（总监）");
        map.put("Element2","王五（总经理）");
        map.put("Element3","陈六（财务）");
        Condition condition = new Condition();
        condition.setNo(1);
//        启动流程定义
        map.put("condition",condition);
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("myProcess_2", map);
//        输出内容
        System.out.println("流程定义Id :"+instance.getProcessDefinitionId());
        System.out.println("流程实例Id :"+instance.getId());
        System.out.println("当前活动Id :"+instance.getActivityId());
        return "启动成功";
    }

    /**
     * @author： hj
     * @version： 1.0
     * @methodDes：  完成流程实例
     * @date： 2022/3/31 23:02
     */
    @GetMapping("complateTask")
    public String complateTask(String roleName){
//        获取引擎
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        获取RuntimeService
        TaskService taskService = defaultProcessEngine.getTaskService();
        List<Task> taskList = taskService.createTaskQuery()
                .taskAssignee(roleName)
                .processDefinitionKey("myProcess_2")
                .list();
        for (Task task : taskList) {
            taskService.complete(task.getId());
            System.out.println(roleName+"完成了"+task.getName()+"任务");
        }
        return "完成任务";
    }


    /**
     * @author： hj
     * @version： 1.0
     * @methodDes：查询流程角色流程实例
     * @date： 2022/3/31 22:34
     */
    @GetMapping("querytTask")
    public String querytTask(String roleName){
//        获取引擎
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//        获取TaskService
        TaskService taskService = defaultProcessEngine.getTaskService();
//        根据
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey("myProcess_2")
                .taskAssignee(roleName)
                .processInstanceId("35005")
                .list();
        for (Task task : taskList) {
            System.out.println("流程实例Id :"+task.getProcessInstanceId());
            System.out.println("任务Id :"+task.getId());
            System.out.println("任务负责人 :"+task.getAssignee());
            System.out.println("任务名称 :"+task.getName());
        }
        return null;
    }

































}
